package rn;

import entidades.UnidadeMilitar;
import entidades.Usuario;
import excessoes.DAOException;
import fabricas.DAOFabrica;
import interfaces.InterfaceVolumeProcessoDAO;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import util.FacesUtil;
import entidades.LogEventos;
import entidades.Setor;
import entidades.TramitacaoVolume;
import entidades.VolumeProcesso;

/**
 *
 * @author Marcelo Gomes Neto
 */
public class VolumeProcessoRN 
{
    private InterfaceVolumeProcessoDAO interfaceVolumeProcessoDAO;

    public VolumeProcessoRN() {
        this.interfaceVolumeProcessoDAO = DAOFabrica.criarVolumeProcessoDAO();
    }

    public VolumeProcesso carregarVolume(Integer id) throws Exception {
        return this.interfaceVolumeProcessoDAO.carregarVolume(id);
    }
    
    public void incluirVolume(VolumeProcesso volumeProcesso, Usuario usuario) throws DAOException, Exception
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer volume = volumeProcesso.getVolume();
        Integer idusu = usuario.getIdusuario();
        Integer idUnidadeUsu = usuario.getPessoa().getUnidade();
        Integer idSetorUsu = usuario.getPessoa().getSetor();
        String postNome = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        
        //Obtem a descrição da OM e do Setor
        UnidadeMilitarRN umRN = new UnidadeMilitarRN();
        UnidadeMilitar um = umRN.carregarUnidadeMilitar(idUnidadeUsu);
        String omSigla = um.getSiglaOM();
        
        SetorRN stRN = new SetorRN();
        Setor st = stRN.carregarSetor(idSetorUsu);
        String stSigla = st.getSiglaSetor();
        
        //Seta definições na tabela volumeProcesso
        volumeProcesso.setCadastradoPor(postNome);
        volumeProcesso.setDataCadastramento(dataAtual);
        volumeProcesso.setUnidadeAtual(idUnidadeUsu);
        volumeProcesso.setSetorAtual(idSetorUsu); 
        volumeProcesso.setDataEntradaSetor(dataAtual);
        volumeProcesso.setEncaminhadoPor(postNome);
        
        //Seta os registros da tabela TRAMITACAO
        TramitacaoVolume tramitacaoVolume = new TramitacaoVolume();  
        Set<TramitacaoVolume> tramita = new HashSet<>();
        tramitacaoVolume.setDataTramitacao(dataAtual);
        tramitacaoVolume.setRemetente(postNome);
        tramitacaoVolume.setUnidadeRemetente(omSigla);
        tramitacaoVolume.setSetorRemetente(stSigla); //No cadastro do PAG, pega o setor de usuário que cadastrou o pag.
        tramitacaoVolume.setUnidadeDestino(omSigla);
        tramitacaoVolume.setSetorDestino(stSigla);
        tramitacaoVolume.setDespacho("Abertura do volume "+volume+".");
        tramita.add(tramitacaoVolume);
        tramitacaoVolume.setVolumeProcesso(volumeProcesso);
        volumeProcesso.setTramitacaoVolume(tramita);

        // Registra na tabela Log_Eventos
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusu);
        logEventos.setDataEvento(dataAtual);
        
        this.interfaceVolumeProcessoDAO.incluirVolume(volumeProcesso);
        logEventos.setDescricao("o usuário "+postNome+" ("+omSigla+") cadastrou o volume "+volumeProcesso.getVolume()+" no processo nº "+volumeProcesso.getProcesso().getPag()+".");
        logEventosRN.salvarEvento(logEventos);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro efetuado com sucesso!", ""));
    }
    
    public void excluirVolume(VolumeProcesso volumeProcesso, Usuario usuario) throws Exception 
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer idusu = usuario.getIdusuario();
        Integer idUnidadeUsu = usuario.getPessoa().getUnidade();
        Integer volume = volumeProcesso.getVolume();
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        String pag = volumeProcesso.getProcesso().getPag();

        //Obtem a sigla da OM
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar unidade = unidadeMilitarRN.carregarUnidadeMilitar(idUnidadeUsu);
        String siglaOM = unidade.getSiglaOM();
        
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusu);
        logEventos.setDataEvento(dataAtual);

        Integer status = volumeProcesso.getProcesso().getStatus();
        if (status == 1) 
        {
            this.interfaceVolumeProcessoDAO.excluirVolume(volumeProcesso);
            logEventos.setDescricao("o usuário "+nomeUsuario+" ("+siglaOM+") excluiu o volume "+volume+" do processo nº "+pag+".");
            logEventosRN.salvarEvento(logEventos);
            //FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Volume excluído com sucesso!", ""));
        }
        else {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "O volume "+volume+" do processo nº "+pag+" não pode ser excluído! O processo está arquivado.", ""));
        }
    }
    
    public List<VolumeProcesso> listarVolume() {
        return this.interfaceVolumeProcessoDAO.listarVolume();
    }
    
    public List<VolumeProcesso> listarVolumesPorProcesso(int idprocesso, int idvolume) {
        return this.interfaceVolumeProcessoDAO.listarVolumesPorProcesso(idprocesso, idvolume);
    }
    
    public List<VolumeProcesso> listarVolumesPorProcesso(int idprocesso) {
        return this.interfaceVolumeProcessoDAO.listarVolumesPorProcesso(idprocesso);
    }
    
    public VolumeProcesso carregarVolumePorProcesso(int idprocesso, int idvolume) {
        return this.interfaceVolumeProcessoDAO.carregarVolumePorProcesso(idprocesso, idvolume);
    }
    
    public List<VolumeProcesso> listarVolumesNoSetor(int unidadeAtual, int setorAtual) {
        return this.interfaceVolumeProcessoDAO.listarVolumesNoSetor(unidadeAtual, setorAtual);
    }
    
    public Object totalVolumesNoSetor(int unidadeAtual, int setorAtual) {
        return this.interfaceVolumeProcessoDAO.totalVolumesNoSetor(unidadeAtual, setorAtual);
    }
    
    public Object totalVolumesPorStatus(int status) {
        return this.interfaceVolumeProcessoDAO.totalVolumesPorStatus(status);
    }
    
    public List<VolumeProcesso> listarVolumesPorStatus(int status) {
        return this.interfaceVolumeProcessoDAO.listarVolumesPorStatus(status);
    }
    
    public List<VolumeProcesso> listarVolumesPorPeriodo(Date dataIni, Date dataFim, int status) {
        return this.interfaceVolumeProcessoDAO.listarVolumesPorPeriodo(dataIni, dataFim, status);
    }
}